<script type="text/javascript">
	document.write('<br>子串的识别: <br>'); 
	//子串的识别
	//这三个方法只返回布尔值，如果需要知道子串的位置，还是得用 indexOf 和 lastIndexOf 。
	//这三个方法如果传入了正则表达式而不是字符串，会抛出错误。而 indexOf 和 lastIndexOf 这两个方法，它们会将正则表达式转换为字符串并搜索它。
	let string = "apple,banana,orange";
	//includes()：返回布尔值，判断是否找到参数字符串。
	s1 = string.includes("banana");     // true
	//startsWith()：返回布尔值，判断参数字符串是否在原字符串的头部。
	s2 = string.startsWith("apple");    // true
	//endsWith()：返回布尔值，判断参数字符串是否在原字符串的尾部。
	s3 = string.endsWith("apple");      // false
	s4 = string.startsWith("banana",6);  // true


	//indexOf() 方法可返回某个指定的字符串值在字符串中首次出现的位置。
	s5 = string.indexOf("banana");
	s6 = string.indexOf("banana",8);
	//注释：indexOf() 方法对大小写敏感！
	//注释：如果要检索的字符串值没有出现，则该方法返回 -1。
	document.write(s1 +' '+s2 +' '+s3 +' '+s4 +' '+s5 +' '+s6);




	document.write('<br><br><br>字符串重复: <br>'); 
	//字符串重复
	//repeat()：返回新的字符串，表示将字符串重复指定次数返回。
	t1 = ("Hello,".repeat(2)); // "Hello,Hello,"
	//如果参数是小数，向下取整
	t2 = ("Hello,".repeat(3.2)); // "Hello,Hello,Hello,"
	//零次
	//如果参数是 0 至 -1 之间的小数，会进行取整运算，0 至 -1 之间的小数取整得到 -0 ，等同于 repeat 零次
	t3 = ("Hello,".repeat(-0.5)); // "" 
	//如果参数是 NaN，等同于 repeat 零次
	t4 = ("Hello,".repeat(NaN)); // "" 

	//如果参数是负数或者 Infinity ，会报错:
	//t5 = ("Hello,".repeat(-1));  // RangeError: Invalid count value
	//t6 = ("Hello,".repeat(Infinity)); // RangeError: Invalid count value

	//如果传入的参数是字符串，则会先将字符串转化为数字
	t7 = ("Hello,".repeat("hh")); // ""
	t8 = ("Hello,".repeat("2"));  // "Hello,Hello,"
	document.write(t1+' <br>'+t2+'<br>'+t3+' <br>'+t4+'<br> '+t7+'<br> '+t8);


	document.write('<br><br><br>字符串补全: <br>'); 
	//字符串补全
	//padStart：返回新的字符串，表示用参数字符串从头部（左侧）补全原字符串。
	//padEnd：返回新的字符串，表示用参数字符串从尾部（右侧）补全原字符串。

	//以上两个方法接受两个参数，第一个参数是指定生成的字符串的最小长度，第二个参数是用来补全的字符串。如果没有指定第二个参数，默认用空格填充。
	a1 = ("h".padStart(5,"o"));// "ooooh"
	a2 = ("h".padEnd(5,"o"));    // "hoooo"
	a3 = ("h".padStart(5));      // "    h"

	//如果指定的长度小于或者等于原字符串的长度，则返回原字符串:
	a4 = ("hello".padStart(5,"A"));  // "hello"

	//如果原字符串加上补全字符串长度大于指定长度，则截去超出位数的补全字符串:
	a5 = ("hello".padEnd(10,",world!"));  // "hello,worl"

	//常用于补全位数：
	a6 = ("123".padStart(10,"0"));  // "0000000123"
	document.write(a1 +'<br> '+a2 +'<br> '+a3 +'<br> '+a4 +'<br> '+a5 +'<br> '+a6);



	document.write('<br><br><br>模板字符串: <br>'); 
	//模板字符串
	//模板字符串相当于加强版的字符串，用反引号 `,除了作为普通字符串，还可以用来定义多行字符串，还可以在字符串中加入变量和表达式。

	let b1 = `Hello'\n<br>'world`;
	// "Hello'
	// 'world"
	

	//字符串插入变量和表达式。变量名写在 ${} 中，${} 中可以放入 JavaScript 表达式。
	let name1 = "Mike";
	let age1 = 27;
	let info = `My Name is ${name1},I am ${age1+1} years old next year.`;
	// My Name is Mike,I am 28 years old next year.

	//字符串中调用函数：
	function f(){
	  return "have fun!";
	}
	let b2= `Game start,${f()}`;

	//注意要点:模板字符串中的换行和空格都是会被保留的
	innerHtml = `<ul>
	  <li>menu</li>
	  <li>mine</li>
	</ul>
	`;

	document.write(b1+'<br> '+info+'<br> '+b2+'<br> '+innerHtml);



	document.write('<br><br><br>标签模板: <br>'); 
	//标签模板
	//标签模板，是一个函数的调用，其中调用的参数是模板字符串。
	//alert`Hello world!`; // 等价于alert('Hello world!');

	//当模板字符串中带有变量，会将模板字符串参数处理成多个参数。
	function f1(stringArr,...values){
		let result = "";
		if(stringArr){
			for(let i=0;i<stringArr.length;i++){
				result += stringArr[i];
			  	if(values[i]){
			   		result += values[i];
			    }
			}
		}
		
		return result;
	}
	let name = 'Mike';
	let age = 27;
	c1 = f1`My Name is ${name},I am ${age+1} years old next year.`;
	// "My Name is Mike,I am 28 years old next year."



	function f2(stringArr,...values){
		let result = "";
		for(let i=0;i<stringArr.length;i++){
		  	result += stringArr[i];
		   	if(values[i]){
		    result += String(values[i]).replace(/&/g, "&amp;")
		               .replace(/</g, "&lt;")
		               .replace(/>/g, "&gt;");
		    }
		 }
		 return result;
	}
	name2 = '<Amy&MIke>';
	c2 = f2`<p>Hi, ${name}.I would like send you some message.</p>`;
	document.write(c1+'<br> '+c2); 

</script>